package lmh.example.exam3_3;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class MainActivity extends Activity {
    private DatagramSocket socket = null;
    private DatagramPacket pack2 = null;

    TextView tv = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            // InetAddress add=InetAddress.getByName("192.168.0.188");
            socket = new DatagramSocket(7788);  // 7788为Android端UDP端口
        } catch (SocketException e1) {

            e1.printStackTrace();
        }
        Button btn = (Button) this.findViewById(R.id.send);
        final EditText et = (EditText) this.findViewById(R.id.input); // 为什么要添加final修饰
        tv = (TextView) this.findViewById(R.id.show); // 获取文本框的内容
        // 发送信息的函数
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    public void run() {
                        String str = et.getText().toString();
                        Log.v("发送", str);
                        sendMsg(str);  //sendMsg函数已经封装好，这里直接拿来用
                    }
                }).start();
            }
        });

        // 接收信息的函数
        try {
            receiveMsg();  //receiveMsg()函数也已经封装好，这里只需要拿来用即可，要体现java的封装思想**
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 定义发送消息的函数sendMsg()
     */
    public void sendMsg(String msg) {
        Log.v("v", "开始发送");
        try {
            if (socket == null) {
                socket = new DatagramSocket(7788);
                //用DatagramSocket创建一个sokcet对象发送数据包，// 7788为Android端UDP端口
            }
            InetAddress server = InetAddress.getByName("192.168.116.2");
            //上面代码的意思是获取Server端的IP的地址，一般情况下使用InetAddress.getByName("IP")的形式，但是也可以用 getAllName()或者getLocalHost()的形式，得到本地主机的地址
            byte data[] = msg.getBytes();  //将字符串转换成字节流，因为底层的传输都是字节传输
            DatagramPacket pack = new DatagramPacket(data, data.length, server,
                    8899); // 创建DatagramPacket 对象数据包，这里的8899是我们要发送信息主机的端口号
            socket.send(pack);
            Log.v("f", "发送成功！");
        } catch (Exception e) {
            Log.v("f", "发送失败！");
            e.printStackTrace();
        }
    }

    public void receiveMsg() throws Exception {
        // 创建线程，同理，接收信息也要放在线程里面接收**
        new Thread(new Runnable() {
            public void run() {
                if (socket != null) {
                    String str;
                    while (true) {
                        try {
                            // 创建一个空的字节数组
                            byte[] data2 = new byte[1024];
                            // 将字节数组和数组的长度传进DatagramPacket 创建的对象里面
                            pack2 = new DatagramPacket(data2, data2.length);
                            Log.v("s", "pack2");
                            Log.v("s", "开始接收");
                            socket.receive(pack2);  // socket对象接收pack包，程序启动的时候，socket会一直处于阻塞状态，直到有信息传输进来**
                            String ip = pack2.getAddress().getHostAddress();  //这段代码的作用获取发送数据的IP地址
                            int port = pack2.getPort();  //获取发送数据端的端口号

                            str = new String(pack2.getData(), 0, pack2.getLength()); // 将字节数组转化成字符串表现出来
                            tv.setText(str);
                            Log.v("s", "接收成功: " + str);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                }
            }
        }).start();
    }

}